package com.zyf.pattern.proxy.cgilb;

import org.springframework.cglib.core.DebuggingClassWriter;

/**
 * create by yifeng
 */
public class CglibTest {

    public static void main(String[] args) throws Exception {
        //JDK采用读取接口的信息
        // CGLib覆盖父类的方法
        // 目的：都是生成一个新的类，去实现增强代码逻辑的功能

        //JDK Proxy对于用户而言，必须要有一个接口实现，目标类相对复杂
        // CGLib 可以代理任意一个普通的类，没有任何要求
        // CGLib 生成代理逻辑更复杂，效率，调用效率更高，生成一个包含了所有的逻辑的FastClass，不再需要放射
        // JDK Proxy生成代理的逻辑简单，执行效率相对要低，每次都要反射动态调用

        // CGLib 有个坑，CGLib不能代理final的方法
        System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY,
                "E://cglib_proxy_classes");
        // 生成的类为LiSi的子类，子类是可以直接赋值给父类的，子类也可以覆盖父类的方法
        LiSi instance = (LiSi) new CGLIBMeipo().getInstance(LiSi.class);
        instance.findLove();
        System.out.println("---------------");
        System.out.println("class com.zyf.pattern.proxy.cgilb.LiSi$$EnhancerByCGLIB$$e86c631b");
        System.out.println(instance.getClass());
    }

}
